﻿
#include "Engine/common.h"
#include "Engine/uimgr.h"
#include "Engine/ControlDef.h"
#include "strid.h"
#include "DNF定义.h"
#include "设置模块.h"
#include "AppUI.h"

//定义的顺序和输出详细信息的顺序有关
//其中强力一击和冥想最重要，剩下技能按列顺序录入
enum 规律技能
{
	规律_强力一击,
	规律_冥想,
	规律_魔弹射手,
	规律_魔力增幅,
	规律_预备弹匣,
	规律_乱射,
	规律_魔剑舞者,
	规律_荆棘护甲,
	规律_剑刃帐幕,
	规律_剑痕,
	规律_魔工学炮手,
	规律_核融合	,
	规律_空气力学,
	规律_魔力猎食,
	规律技能数量,
};

enum 猛攻技能
{
	猛攻_强力一击,
	猛攻_冥想,
	猛攻_速攻连击,
	猛攻_速攻奔涌击,
	猛攻_速攻闪影击,
	猛攻_破竹之势,
	猛攻_强袭破击,
	猛攻_强袭强腕击,
	猛攻_强袭泰山击,
	猛攻_英雄豪杰,
	猛攻技能数量,
};

enum 保护技能
{
	保护_强力一击,
	保护_冥想,
	保护_保护罩填充,
	保护_护盾爆裂爆炸,
	保护_火盾,
	保护_背水一战,
	保护_保护罩续充,
	保护_护盾爆裂恢复,
	保护_水盾,
	保护_披靡庇护,
	保护技能数量,
};

enum 具现技能
{
	具现_强力一击,
	具现_冥想,
	具现_灵药炼制,
	具现_力量精通,
	具现_强化力量精通,
	具现_传说再现破坏,
	具现_高效炼制,
	具现_精炼收尾,
	具现_完美炼制,
	具现_一级炼制术士,
	具现_治愈精通,
	具现_强化治愈精通,
	具现_传说再现守护,
	具现技能数量,
};

const int 类型按钮宽度=特性面板宽度/4;
const int 类型按钮高度=105;
const int 特性设置区宽度=315;
const int 特性设置区高度=特性面板高度-类型按钮高度;
const int 特性信息区宽度=特性面板宽度-特性设置区宽度;
const int 特性信息区高度=特性面板高度-类型按钮高度;

const int 升级按钮宽度=16;	//降级按钮一样大
const int 升级按钮高度=16;
const int 升级按钮偏移X=39;
const int 升级按钮偏移Y=36;
const int 降级按钮偏移X=-5;
const int 降级按钮偏移Y=36;

const int 等级标签宽度=30;
const int 等级标签高度=16;
const int 等级标签偏移X=10;
const int 等级标签偏移Y=36;

const int 技能图标宽度=49;	//光圈与技能图标重合
const int 技能图标高度=49;
const int 技能图标偏移X=23-5;	//不透明区域仅39*39，整体49*49
const int 技能图标偏移Y=146-5;
const int 技能图标间距X=75;
const int 技能图标间距Y=75;

CImage* 升级按钮;
CImage* 降级按钮;
CImage* 技能光圈;
CLabel* 点数标签;
CButton* 重置按钮;
CVScrollView* 详情滚动视图;
CLabel* 特性技能详情页;
	
CImage* Ctrl特性面板;

struct 特性技能属性  
{
	//固定属性
	int 类型;
	int 等级上限;
	int 点数消耗[10];
	int 提升参数数量;
	float 提升参数1[10];
	float 提升参数2[10];
	float 提升参数3[10];
	WCHAR* 描述;
	int 动态描述生效等级;
	BOOL 含有动态参数;
	WCHAR* 动态描述;
	//UI固定属性
	int X;
	int Y;
	int 图标Id;
	int 暗图标Id;
	//可变属性
	int 等级;			//等级会变更
	CImage* 技能控件;	//图标会变更
	CImage* 等级控件;	//图标会变更
};

const int 特性技能总数=规律技能数量+猛攻技能数量+保护技能数量+具现技能数量;	//14+10+10+13=47

int 技能类型索引[特性类型总数+1]={0,规律技能数量,规律技能数量+猛攻技能数量,规律技能数量+猛攻技能数量+保护技能数量,规律技能数量+猛攻技能数量+保护技能数量+具现技能数量};
int 技能类型数量[特性类型总数]={规律技能数量,猛攻技能数量,保护技能数量,具现技能数量};

特性技能属性 技能对象[特性技能总数];

void 设置特性技能属性(int 类型,int 技能索引,int 等级上限,int 提升参数数量,int NX,int NY,int 图标索引,int 暗图标索引)
{
	int BaseIndex=技能类型索引[类型];
	特性技能属性* 目标对象=&技能对象[BaseIndex+技能索引];

	目标对象->等级=0;
	目标对象->技能控件=NULL;
	目标对象->等级控件=NULL;
	目标对象->动态描述生效等级=-1;
	目标对象->含有动态参数=FALSE;

	目标对象->类型=类型;
	目标对象->等级上限=等级上限;
	目标对象->提升参数数量=提升参数数量;
	//位置是有限的，4列5行
	目标对象->X=技能图标偏移X+NX*技能图标间距X;
	目标对象->Y=技能图标偏移Y+NY*技能图标间距Y;

	int BaseResId;
	if (类型==0)
		BaseResId=RID_特性技能规律图标;
	else if (类型==1)
		BaseResId=RID_特性技能猛攻图标;
	else if (类型==2)
		BaseResId=RID_特性技能保护图标;
	else if (类型==3)
		BaseResId=RID_特性技能具现图标;
	目标对象->图标Id=BaseResId+图标索引;
	目标对象->暗图标Id=BaseResId+暗图标索引;
}

void 设置特性技能消耗点数(int 类型,int 技能索引,int lv1,int lv2=0,int lv3=0,int lv4=0,int lv5=0,int lv6=0,int lv7=0,int lv8=0,int lv9=0,int lv10=0)
{
	int BaseIndex=技能类型索引[类型];
	特性技能属性* 目标对象=&技能对象[BaseIndex+技能索引];
	目标对象->点数消耗[0]=lv1;
	目标对象->点数消耗[1]=lv2;
	目标对象->点数消耗[2]=lv3;
	目标对象->点数消耗[3]=lv4;
	目标对象->点数消耗[4]=lv5;
	目标对象->点数消耗[5]=lv6;
	目标对象->点数消耗[6]=lv7;
	目标对象->点数消耗[7]=lv8;
	目标对象->点数消耗[8]=lv9;
	目标对象->点数消耗[9]=lv10;
}

void 设置特性技能提升参数1(int 类型,int 技能索引,float lv1,float lv2=0,float lv3=0,float lv4=0,float lv5=0,float lv6=0,float lv7=0,float lv8=0,float lv9=0,float lv10=0)
{
	int BaseIndex=技能类型索引[类型];
	特性技能属性* 目标对象=&技能对象[BaseIndex+技能索引];
	目标对象->提升参数1[0]=lv1;
	目标对象->提升参数1[1]=lv2;
	目标对象->提升参数1[2]=lv3;
	目标对象->提升参数1[3]=lv4;
	目标对象->提升参数1[4]=lv5;
	目标对象->提升参数1[5]=lv6;
	目标对象->提升参数1[6]=lv7;
	目标对象->提升参数1[7]=lv8;
	目标对象->提升参数1[8]=lv9;
	目标对象->提升参数1[9]=lv10;
}

void 设置特性技能提升参数2(int 类型,int 技能索引,float lv1,float lv2=0,float lv3=0,float lv4=0,float lv5=0,float lv6=0,float lv7=0,float lv8=0,float lv9=0,float lv10=0)
{
	int BaseIndex=技能类型索引[类型];
	特性技能属性* 目标对象=&技能对象[BaseIndex+技能索引];
	目标对象->提升参数2[0]=lv1;
	目标对象->提升参数2[1]=lv2;
	目标对象->提升参数2[2]=lv3;
	目标对象->提升参数2[3]=lv4;
	目标对象->提升参数2[4]=lv5;
	目标对象->提升参数2[5]=lv6;
	目标对象->提升参数2[6]=lv7;
	目标对象->提升参数2[7]=lv8;
	目标对象->提升参数2[8]=lv9;
	目标对象->提升参数2[9]=lv10;
}

void 设置特性技能描述(int 类型,int 技能索引,WCHAR* 描述)
{
	int BaseIndex=技能类型索引[类型];
	特性技能属性* 目标对象=&技能对象[BaseIndex+技能索引];
	//直接使用编辑器提供的静态字符串，不再分配和释放
	目标对象->描述=描述;
}

void 设置特性技能动态描述(int 类型,int 技能索引,int 动态描述生效等级,BOOL 含有动态参数,WCHAR* 动态描述)
{
	//某些技能的描述会随等级而变更，当高于预定等级时，使用变更后的描述字符串
	//根据观察，除了强力一击有3种（第一种是纯辅助属性），其余都只有2种
	//大部分技能都只有2个及以下参数，少数技能换成动态描述后，额外增加1个参数
	int BaseIndex=技能类型索引[类型];
	特性技能属性* 目标对象=&技能对象[BaseIndex+技能索引];
	目标对象->动态描述生效等级=动态描述生效等级;
	目标对象->含有动态参数=含有动态参数;
	//直接使用编辑器提供的静态字符串，不再分配和释放
	目标对象->动态描述=动态描述;
}

void 设置特性技能动态提升参数(int 类型,int 技能索引,float lv1,float lv2=0,float lv3=0,float lv4=0,float lv5=0,float lv6=0,float lv7=0,float lv8=0,float lv9=0,float lv10=0)
{
	int BaseIndex=技能类型索引[类型];
	特性技能属性* 目标对象=&技能对象[BaseIndex+技能索引];

	//没达到动态描述生效等级之前一切照旧
	//如果含有动态参数，达到等级后，实际参数个数+1
	float* 目标参数数组;
	if (目标对象->提升参数数量==0)
		目标参数数组=目标对象->提升参数1;
	else if (目标对象->提升参数数量==1)
		目标参数数组=目标对象->提升参数2;
	else if (目标对象->提升参数数量==2)
		目标参数数组=目标对象->提升参数3;
	目标参数数组[0]=lv1;
	目标参数数组[1]=lv2;
	目标参数数组[2]=lv3;
	目标参数数组[3]=lv4;
	目标参数数组[4]=lv5;
	目标参数数组[5]=lv6;
	目标参数数组[6]=lv7;
	目标参数数组[7]=lv8;
	目标参数数组[8]=lv9;
	目标参数数组[9]=lv10;
}

void 初始化数据和创建控件();
void 切换特性类型(int TypeIndex);	//Index不变时，等价于重置当前页面
void 切换选中技能(int SkillIndex);	//可以-1取消选择
void 变更技能等级(int AddValue);		//索引以[当前技能]为准
void 同步特性面板();					//用于页面初始化，重置并应用设置

int OnBackClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);
int OnSkillClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);
int OnLevelBtnClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);
int OnResetLevelBtnClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2);

int 当前类型;
int 当前技能;
int 总技能点数;

void 初始化数据和创建控件()
{
	//如有必要，可以将[强力一击]的辅助专属效果写到描述里，现在先不加
	//代码只支持2段，即使加也只加第三段的输出部分

	//规律
	//////////////////////////////////////////////////////////////////////////
	设置特性技能属性(特性_规律,规律_强力一击,5,1,3,0,33,32);
	设置特性技能消耗点数(特性_规律,规律_强力一击,96,96,96,96,96);
	设置特性技能提升参数1(特性_规律,规律_强力一击,10,16,22,28,35);
	设置特性技能描述(特性_规律,规律_强力一击,L"[强力一击]\n技能伤害+%.1f%%\n");

	设置特性技能属性(特性_规律,规律_冥想,2,1,3,1,35,34);
	设置特性技能消耗点数(特性_规律,规律_冥想,96,96);
	设置特性技能提升参数1(特性_规律,规律_冥想,10,20);
	设置特性技能描述(特性_规律,规律_冥想,L"[冥想]\n技能冷却时间-%.1f%%（觉醒技能除外）\n");

	设置特性技能属性(特性_规律,规律_魔弹射手,7,2,0,0,1,0);
	设置特性技能消耗点数(特性_规律,规律_魔弹射手,30,30,30,30,30,60,60);
	设置特性技能提升参数1(特性_规律,规律_魔弹射手,98,196,294,588,979,1126,1350);
	设置特性技能提升参数2(特性_规律,规律_魔弹射手,1,1,1,1,1,1,1);
	设置特性技能描述(特性_规律,规律_魔弹射手,L"[魔弹射手]\n攻击时，发射魔弹，对附近的敌人造成伤害。（冷却时间0.5秒）\n"
		L"-魔弹伤害量：%.1f%%\n"
		L"-魔弹发射个数：%.0f个\n");

	设置特性技能属性(特性_规律,规律_魔力增幅,7,1,0,1,27,26);
	设置特性技能消耗点数(特性_规律,规律_魔力增幅,30,30,30,30,30,60,60);
	设置特性技能提升参数1(特性_规律,规律_魔力增幅,10,15,20,25,30,35,40);
	设置特性技能描述(特性_规律,规律_魔力增幅,L"[魔力增幅]\n魔弹伤害量+%.1f%%\n");

	设置特性技能属性(特性_规律,规律_预备弹匣,1,0,0,2,9,8);
	设置特性技能消耗点数(特性_规律,规律_预备弹匣,80);
	设置特性技能描述(特性_规律,规律_预备弹匣,L"[预备弹匣]\n魔弹发射个数+2个\n");

	设置特性技能属性(特性_规律,规律_乱射,2,0,0,3,31,30);
	设置特性技能消耗点数(特性_规律,规律_乱射,100,100);
	设置特性技能描述(特性_规律,规律_乱射,L"[乱射]\n第6次发射魔弹时，魔弹个数增加至3倍。\n");
	设置特性技能动态描述(特性_规律,规律_乱射,2,FALSE,L"[乱射]\n第6次发射魔弹时，魔弹个数增加至3倍。\n"
		L"第66次发射魔弹时，发动魔弹爆发。\n"
		L"-爆发的魔弹伤害量适用[魔弹射手]的显示数值。\n");

	设置特性技能属性(特性_规律,规律_魔剑舞者,10,2,1,0,11,10);
	设置特性技能消耗点数(特性_规律,规律_魔剑舞者,10,10,10,20,20,20,20,30,30,60);
	设置特性技能提升参数1(特性_规律,规律_魔剑舞者,306,459,612,688,917,1070,1310,1441,1572,1868);
	设置特性技能提升参数2(特性_规律,规律_魔剑舞者,1.5,1.5,1.5,2.0,2.5,3.0,3.5,3.5,3.5,3.5);
	设置特性技能描述(特性_规律,规律_魔剑舞者,L"[魔剑舞者]\n攻击时，生成[魔剑风暴]，对附近的敌人造成伤害。（冷却时间5秒）\n"
		L"-[魔剑风暴]伤害量：%.1f%%\n"
		L"-[魔剑风暴]持续时间：%.1f秒\n");

	设置特性技能属性(特性_规律,规律_荆棘护甲,5,1,1,1,13,12);
	设置特性技能消耗点数(特性_规律,规律_荆棘护甲,20,20,20,20,20);
	设置特性技能提升参数1(特性_规律,规律_荆棘护甲,10,20,30,40,50);
	设置特性技能描述(特性_规律,规律_荆棘护甲,L"[荆棘护甲]\n[魔剑风暴]范围+%.1f%%\n");

	设置特性技能属性(特性_规律,规律_剑刃帐幕,7,1,1,2,15,14);
	设置特性技能消耗点数(特性_规律,规律_剑刃帐幕,20,20,20,30,30,50,50);
	设置特性技能提升参数1(特性_规律,规律_剑刃帐幕,5,10,15,20,25,30,35);
	设置特性技能描述(特性_规律,规律_剑刃帐幕,L"[剑刃帐幕]\n[魔剑风暴]伤害量+%.1f%%\n");

	设置特性技能属性(特性_规律,规律_剑痕,7,1,1,3,17,16);
	设置特性技能消耗点数(特性_规律,规律_剑痕,30,30,30,30,30,60,60);
	设置特性技能提升参数1(特性_规律,规律_剑痕,10,20,30,40,50,55,65);
	设置特性技能描述(特性_规律,规律_剑痕,L"[剑痕]\n[魔剑风暴]多段攻击间隔-%.1f%%\n");

	//[规律_剑刃帐幕]每点一级，[规律_魔工学炮手]显示的伤害就会+1%，不知道是不是bug
	设置特性技能属性(特性_规律,规律_魔工学炮手,7,1,2,0,19,18);
	设置特性技能消耗点数(特性_规律,规律_魔工学炮手,20,20,20,20,20,40,40);
	设置特性技能提升参数1(特性_规律,规律_魔工学炮手,486,973,1459,2919,4864,5837,7094);
	设置特性技能描述(特性_规律,规律_魔工学炮手,L"[魔工学炮手]\n生成一个追踪敌人进行攻击的魔力炮。（再次生成所需冷却时间30秒）\n"
		L"-魔力炮伤害量：%.1f%%\n"
		L"-魔力炮持续时间：10秒\n");

	设置特性技能属性(特性_规律,规律_核融合,5,1,2,1,25,24);
	设置特性技能消耗点数(特性_规律,规律_核融合,30,30,30,50,50);
	设置特性技能提升参数1(特性_规律,规律_核融合,5,7,10,15,20);
	设置特性技能描述(特性_规律,规律_核融合,L"[核融合]\n魔力炮伤害量+%.1f%%\n");

	设置特性技能属性(特性_规律,规律_空气力学,5,1,2,2,21,20);
	设置特性技能消耗点数(特性_规律,规律_空气力学,30,30,30,30,30);
	设置特性技能提升参数1(特性_规律,规律_空气力学,7,10,12,15,20);
	设置特性技能描述(特性_规律,规律_空气力学,L"[空气力学]\n魔力炮多段攻击间隔-%.1f%%\n");

	设置特性技能属性(特性_规律,规律_魔力猎食,5,2,2,3,3,2);
	设置特性技能消耗点数(特性_规律,规律_魔力猎食,40,50,50,80,80);
	设置特性技能提升参数1(特性_规律,规律_魔力猎食,3,4,5,5,5);
	设置特性技能提升参数2(特性_规律,规律_魔力猎食,5,4,3,3,3);
	设置特性技能描述(特性_规律,规律_魔力猎食,L"[魔力猎食]\n每次攻击魔力炮时，持续时间+%.0f秒。（冷却时间%.0f秒）\n");
	设置特性技能动态描述(特性_规律,规律_魔力猎食,4,TRUE,L"[魔力猎食]\n每次攻击魔力炮时，持续时间+%.0f秒。（冷却时间%.0f秒）\n"
		L"魔力炮被攻击时，释放魔力波动。（冷却时间7秒）\n"
		L"-魔力波动伤害量：魔力炮伤害量的%.1f%%\n");
	设置特性技能动态提升参数(特性_规律,规律_魔力猎食,0,0,0,100,300);

	//猛攻
	//////////////////////////////////////////////////////////////////////////
	设置特性技能属性(特性_猛攻,猛攻_强力一击,5,1,3,0,23,22);
	设置特性技能消耗点数(特性_猛攻,猛攻_强力一击,96,96,96,96,96);
	设置特性技能提升参数1(特性_猛攻,猛攻_强力一击,10,16,22,28,35);
	设置特性技能描述(特性_猛攻,猛攻_强力一击,L"[强力一击]\n技能伤害+%.1f%%\n");

	设置特性技能属性(特性_猛攻,猛攻_冥想,2,1,3,1,25,24);
	设置特性技能消耗点数(特性_猛攻,猛攻_冥想,96,96);
	设置特性技能提升参数1(特性_猛攻,猛攻_冥想,10,20);
	设置特性技能描述(特性_猛攻,猛攻_冥想,L"[冥想]\n技能冷却时间-%.1f%%（觉醒技能除外）\n");

	设置特性技能属性(特性_猛攻,猛攻_速攻连击,5,1,0,0,1,0);
	设置特性技能消耗点数(特性_猛攻,猛攻_速攻连击,40,40,45,35,35);
	设置特性技能提升参数1(特性_猛攻,猛攻_速攻连击,2.0,3.0,4.0,4.5,5.0);
	设置特性技能描述(特性_猛攻,猛攻_速攻连击,L"[速攻：连击]\n施放技能时，进入[连击]状态5秒。\n[连击]：所有速度+%.1f%%\n");

	设置特性技能属性(特性_猛攻,猛攻_速攻奔涌击,5,1,0,1,3,2);
	设置特性技能消耗点数(特性_猛攻,猛攻_速攻奔涌击,45,45,50,40,40);
	设置特性技能提升参数1(特性_猛攻,猛攻_速攻奔涌击,2.0,3.0,4.0,4.5,5.0);
	设置特性技能描述(特性_猛攻,猛攻_速攻奔涌击,L"[速攻：奔涌击]\n[连击]状态下，施放技能时，进入[奔涌击]状态5秒。\n[奔涌击]：所有速度+%.1f%%\n");

	设置特性技能属性(特性_猛攻,猛攻_速攻闪影击,5,1,0,3,5,4);
	设置特性技能消耗点数(特性_猛攻,猛攻_速攻闪影击,50,50,55,45,45);
	设置特性技能提升参数1(特性_猛攻,猛攻_速攻闪影击,4.0,5.0,6.0,6.5,7.0);
	设置特性技能描述(特性_猛攻,猛攻_速攻闪影击,L"[速攻：闪影击]\n[奔涌击]状态下，施放技能时，进入[闪影击]状态5秒。\n[闪影击]：所有速度+%.1f%%\n");

	设置特性技能属性(特性_猛攻,猛攻_破竹之势,3,1,0,4,7,6);
	设置特性技能消耗点数(特性_猛攻,猛攻_破竹之势,60,50,50);
	设置特性技能提升参数1(特性_猛攻,猛攻_破竹之势,3.0,4.0,5.0);
	设置特性技能描述(特性_猛攻,猛攻_破竹之势,L"[破竹之势]\n[闪影击]状态下，施放技能时，解除所有[攻速]效果，技能伤害+%.1f%%，效果持续10秒。\n");
	设置特性技能动态描述(特性_猛攻,猛攻_破竹之势,3,FALSE,L"[破竹之势]\n[闪影击]状态中施放技能时，技能伤害+%.1f%%，效果持续10秒。\n");

	设置特性技能属性(特性_猛攻,猛攻_强袭破击,5,1,1,0,9,8);
	设置特性技能消耗点数(特性_猛攻,猛攻_强袭破击,40,40,45,35,35);
	设置特性技能提升参数1(特性_猛攻,猛攻_强袭破击,1.0,2.0,3.0,3.5,4.0);
	设置特性技能描述(特性_猛攻,猛攻_强袭破击,L"[强袭：破击]\n施放技能时，进入[破击]状态5秒。\n[破击]：物理/魔法所受伤害-%.1f%%\n");

	设置特性技能属性(特性_猛攻,猛攻_强袭强腕击,5,1,1,1,11,10);
	设置特性技能消耗点数(特性_猛攻,猛攻_强袭强腕击,45,45,50,40,40);
	设置特性技能提升参数1(特性_猛攻,猛攻_强袭强腕击,1.0,2.0,3.0,3.5,4.0);
	设置特性技能描述(特性_猛攻,猛攻_强袭强腕击,L"[强袭：强腕击]\n[破击]状态下，施放技能时，进入[强腕击]状态5秒。\n[强腕击]：物理/魔法所受伤害-%.1f%%\n");

	设置特性技能属性(特性_猛攻,猛攻_强袭泰山击,5,1,1,3,13,12);
	设置特性技能消耗点数(特性_猛攻,猛攻_强袭泰山击,50,50,55,45,45);
	设置特性技能提升参数1(特性_猛攻,猛攻_强袭泰山击,1.0,2.0,3.0,4.0,5.0);
	设置特性技能描述(特性_猛攻,猛攻_强袭泰山击,L"[强袭：泰山击]\n[强腕击]状态下，施放技能时，进入[泰山击]状态5秒。\n[泰山击]：物理/魔法所受伤害-%.1f%%\n");

	设置特性技能属性(特性_猛攻,猛攻_英雄豪杰,3,1,1,4,15,14);
	设置特性技能消耗点数(特性_猛攻,猛攻_英雄豪杰,60,50,50);
	设置特性技能提升参数1(特性_猛攻,猛攻_英雄豪杰,3.0,4.0,5.0);
	设置特性技能描述(特性_猛攻,猛攻_英雄豪杰,L"[英雄豪杰]\n[泰山击]状态下，施放技能时，解除所有[强袭]效果，技能伤害+%.1f%%，并进入霸体状态，效果持续10秒。\n");
	设置特性技能动态描述(特性_猛攻,猛攻_英雄豪杰,3,FALSE,L"[英雄豪杰]\n[泰山击]状态中施放技能时，技能伤害+%.1f%%，效果持续10秒，且进入霸体状态。\n");

	//保护
	//////////////////////////////////////////////////////////////////////////
	设置特性技能属性(特性_保护,保护_强力一击,5,1,3,0,25,24);
	设置特性技能消耗点数(特性_保护,保护_强力一击,96,96,96,96,96);
	设置特性技能提升参数1(特性_保护,保护_强力一击,10,16,22,28,35);
	设置特性技能描述(特性_保护,保护_强力一击,L"[强力一击]\n技能伤害+%.1f%%\n");

	设置特性技能属性(特性_保护,保护_冥想,2,1,3,1,27,26);
	设置特性技能消耗点数(特性_保护,保护_冥想,96,96);
	设置特性技能提升参数1(特性_保护,保护_冥想,10,20);
	设置特性技能描述(特性_保护,保护_冥想,L"[冥想]\n技能冷却时间-%.1f%%（觉醒技能除外）\n");

	设置特性技能属性(特性_保护,保护_保护罩填充,5,1,1,0,3,2);
	设置特性技能消耗点数(特性_保护,保护_保护罩填充,30,30,30,30,30);
	设置特性技能提升参数1(特性_保护,保护_保护罩填充,1,2,3,4,5);
	设置特性技能描述(特性_保护,保护_保护罩填充,L"[保护罩填充]\n施放技能时，赋予生命值最大值3%%的保护罩。（冷却时间3秒，最多叠加%.0f次）\n");

	设置特性技能属性(特性_保护,保护_护盾爆裂爆炸,5,1,0,1,9,8);
	设置特性技能消耗点数(特性_保护,保护_护盾爆裂爆炸,15,15,15,15,15);
	设置特性技能提升参数1(特性_保护,保护_护盾爆裂爆炸,152,304,456,912,1521);
	设置特性技能描述(特性_保护,保护_护盾爆裂爆炸,L"[护盾爆裂-爆炸]\n保护罩解除时，引发爆炸，攻击周围敌人。\n"
		L"-爆炸伤害量：%.1f%%\n");

	设置特性技能属性(特性_保护,保护_火盾,7,1,0,3,15,14);
	设置特性技能消耗点数(特性_保护,保护_火盾,25,25,25,25,25,40,40);
	设置特性技能提升参数1(特性_保护,保护_火盾,101,203,304,608,1014,1217,1521);
	设置特性技能描述(特性_保护,保护_火盾,L"[火盾]\n生成火焰，对触碰到保护罩的敌人造成伤害。（冷却时间0.3秒）\n"
		L"-火焰伤害量：%.1f%%\n");

	设置特性技能属性(特性_保护,保护_背水一战,5,0,0,4,19,18);
	设置特性技能消耗点数(特性_保护,保护_背水一战,100,60,60,70,70);
	设置特性技能描述(特性_保护,保护_背水一战,L"[背水一战]\n解除觉醒技能关联。\n50级技能冷却时间-50%%\n");
	设置特性技能动态描述(特性_保护,保护_背水一战,2,TRUE,L"[背水一战]\n解除觉醒技能关联。\n50级技能冷却时间-50%%\n"
		L"50级技能攻击力+%.1f%%\n");	//技能攻击力对非辅助职业也生效，后面括号里仅增益对辅助职业不生效
	设置特性技能动态提升参数(特性_保护,保护_背水一战,0,10,15,25,30);

	设置特性技能属性(特性_保护,保护_保护罩续充,1,0,1,2,10,0);
	设置特性技能消耗点数(特性_保护,保护_保护罩续充,30);
	设置特性技能描述(特性_保护,保护_保护罩续充,L"[保护罩续充]\n装备的填充型保护罩的填充冷却时间-1秒\n");

	设置特性技能属性(特性_保护,保护_护盾爆裂恢复,5,1,2,1,13,12);
	设置特性技能消耗点数(特性_保护,保护_护盾爆裂恢复,15,15,15,15,15);
	设置特性技能提升参数1(特性_保护,保护_护盾爆裂恢复,1.0,1.5,2.0,2.5,3.0);
	设置特性技能描述(特性_保护,保护_护盾爆裂恢复,L"[护盾爆裂-恢复]\n保护罩解除时，周围300px范围内的队员恢复%.1f%%的生命值和魔法值。\n");

	设置特性技能属性(特性_保护,保护_水盾,7,2,2,3,17,16);
	设置特性技能消耗点数(特性_保护,保护_水盾,25,25,25,25,25,40,40);
	设置特性技能提升参数1(特性_保护,保护_水盾,100,150,200,250,300,300,300);
	设置特性技能提升参数2(特性_保护,保护_水盾,0.2f,0.3f,0.5f,0.7f,1.0f,1.0f,1.0f);
	设置特性技能描述(特性_保护,保护_水盾,L"[水盾]\n保护罩周围%.0fpx内队友的生命值/魔法值恢复%.1f%%（冷却时间3秒）\n");
	设置特性技能动态描述(特性_保护,保护_水盾,6,TRUE,L"[水盾]\n保护罩周围%.0fpx内队友的生命值/魔法值恢复%.1f%%（冷却时间3秒）\n"
		L"技能伤害+%.1f%%\n");
	设置特性技能动态提升参数(特性_保护,保护_水盾,0,0,0,0,0,0.5,1.0);

	设置特性技能属性(特性_保护,保护_披靡庇护,5,1,2,4,21,20);
	设置特性技能消耗点数(特性_保护,保护_披靡庇护,100,60,60,70,70);
	设置特性技能提升参数1(特性_保护,保护_披靡庇护,15,17,20,22,25);
	设置特性技能描述(特性_保护,保护_披靡庇护,L"[披靡庇护]\n100级技能攻击力+%.1f%%\n施放100级技能后，进入无敌状态一段时间。\n");

	//具现
	//////////////////////////////////////////////////////////////////////////
	设置特性技能属性(特性_具现,具现_强力一击,5,1,3,0,27,26);
	设置特性技能消耗点数(特性_具现,具现_强力一击,96,96,96,96,96);
	设置特性技能提升参数1(特性_具现,具现_强力一击,10,16,22,28,35);
	设置特性技能描述(特性_具现,具现_强力一击,L"[强力一击]\n技能伤害+%.1f%%\n");

	设置特性技能属性(特性_具现,具现_冥想,2,1,3,1,29,28);
	设置特性技能消耗点数(特性_具现,具现_冥想,96,96);
	设置特性技能提升参数1(特性_具现,具现_冥想,10,20);
	设置特性技能描述(特性_具现,具现_冥想,L"[冥想]\n技能冷却时间-%.1f%%（觉醒技能除外）\n");

	设置特性技能属性(特性_具现,具现_灵药炼制,7,1,1,0,1,0);
	设置特性技能消耗点数(特性_具现,具现_灵药炼制,20,20,20,20,20,50,50);
	设置特性技能提升参数1(特性_具现,具现_灵药炼制,30,28,26,23,20,18,15);
	设置特性技能描述(特性_具现,具现_灵药炼制,L"[灵药炼制]\n每%.0f秒炼制一~四等灵药\n"
		L"-腕力灵药：技能伤害+1/2/4/5%%，效果持续20秒\n"
		L"-铁壁灵药：物理/魔法所受伤害-4/7/10/15%%，效果持续20秒\n"
		L"-神速灵药：所有速度+5/10/15/20%%，效果持续20秒\n");

	设置特性技能属性(特性_具现,具现_力量精通,7,2,0,1,5,4);
	设置特性技能消耗点数(特性_具现,具现_力量精通,20,20,20,20,20,40,40);
	设置特性技能提升参数1(特性_具现,具现_力量精通,1.0,1.0,1.0,1.0,1.0,1.5,2.0);
	设置特性技能提升参数2(特性_具现,具现_力量精通,5,10,13,16,20,25,25);
	设置特性技能描述(特性_具现,具现_力量精通,L"[力量精通]\n拾取灵药时，技能伤害+%.1f%%，效果持续%.0f秒。\n");

	设置特性技能属性(特性_具现,具现_强化力量精通,7,1,0,2,11,10);
	设置特性技能消耗点数(特性_具现,具现_强化力量精通,30,30,30,30,30,50,50);
	设置特性技能提升参数1(特性_具现,具现_强化力量精通,5,10,13,16,20,22,25);
	设置特性技能描述(特性_具现,具现_强化力量精通,L"[强化-力量精通]\n拾取灵药时，所有速度+5%%，效果持续%.0f秒。\n");

	设置特性技能属性(特性_具现,具现_传说再现破坏,7,1,0,4,21,20);
	设置特性技能消耗点数(特性_具现,具现_传说再现破坏,30,30,30,20,20,30,30);
	设置特性技能提升参数1(特性_具现,具现_传说再现破坏,1,2,3,5,10,10,10);
	设置特性技能描述(特性_具现,具现_传说再现破坏,L"[传说再现-破坏]\n高度成熟的炼金术有时会产生意想不到的效果。\n"
		L"-有%.1f%%的几率生成武具，而非灵药。\n");
	设置特性技能动态描述(特性_具现,具现_传说再现破坏,6,FALSE,L"[传说再现-破坏]\n高度成熟的炼金术有时会产生意想不到的效果。\n"
		L"-有%.1f%%的几率生成武具，而非灵药。\n"
		L"强化武具的性能。\n");

	设置特性技能属性(特性_具现,具现_高效炼制,10,1,1,1,19,18);
	设置特性技能消耗点数(特性_具现,具现_高效炼制,20,20,20,20,20,40,40,50,50,60);
	设置特性技能提升参数1(特性_具现,具现_高效炼制,10,12,24,26,28,30,32,34,37,40);
	设置特性技能描述(特性_具现,具现_高效炼制,L"[高效炼制]\n炼制时，有%.1f%%的几率，额外炼成一个灵药。\n");

	设置特性技能属性(特性_具现,具现_精炼收尾,1,0,1,2,15,14);
	设置特性技能消耗点数(特性_具现,具现_精炼收尾,80);
	设置特性技能描述(特性_具现,具现_精炼收尾,L"[精炼收尾]\n炼制时不会生成四等灵药。\n");

	设置特性技能属性(特性_具现,具现_完美炼制,1,0,1,3,25,24);
	设置特性技能消耗点数(特性_具现,具现_完美炼制,100);
	设置特性技能描述(特性_具现,具现_完美炼制,L"[完美炼制]\n炼制时不会生成三等灵药。\n");

	设置特性技能属性(特性_具现,具现_一级炼制术士,1,0,1,4,9,8);
	设置特性技能消耗点数(特性_具现,具现_一级炼制术士,100);
	设置特性技能描述(特性_具现,具现_一级炼制术士,L"[一级炼制术士]\n炼制时不会生成二等灵药。\n");

	设置特性技能属性(特性_具现,具现_治愈精通,7,1,2,1,7,6);
	设置特性技能消耗点数(特性_具现,具现_治愈精通,20,20,20,20,20,40,40);
	设置特性技能提升参数1(特性_具现,具现_治愈精通,2,3,4,5,7,8,10);
	设置特性技能描述(特性_具现,具现_治愈精通,L"[治愈精通]\n拾取灵药时，恢复%.1f%%的生命值和魔法值。\n");

	设置特性技能属性(特性_具现,具现_强化治愈精通,7,1,2,2,13,12);
	设置特性技能消耗点数(特性_具现,具现_强化治愈精通,30,30,30,30,30,50,50);
	设置特性技能提升参数1(特性_具现,具现_强化治愈精通,5,10,13,16,20,25,25);
	设置特性技能描述(特性_具现,具现_强化治愈精通,L"[强化-治愈精通]\n拾取灵药时，进入霸体状态%.0f秒。\n");
	设置特性技能动态描述(特性_具现,具现_强化治愈精通,6,TRUE,L"[强化-治愈精通]\n拾取灵药时，进入霸体状态%.1f秒，适用无敌状态%.1f秒。\n");
	设置特性技能动态提升参数(特性_具现,具现_强化治愈精通,0,0,0,0,0,0.2f,0.5f);

	设置特性技能属性(特性_具现,具现_传说再现守护,7,1,2,4,23,22);
	设置特性技能消耗点数(特性_具现,具现_传说再现守护,30,30,30,20,20,30,30);
	设置特性技能提升参数1(特性_具现,具现_传说再现守护,1,2,3,5,10,10,10);
	设置特性技能描述(特性_具现,具现_传说再现守护,L"[传说再现-守护]\n高度成熟的炼金术有时会重现传说。\n"
		L"-有%.1f%%的几率生成武具，而非灵药。\n");
	设置特性技能动态描述(特性_具现,具现_传说再现守护,6,FALSE,L"[传说再现-守护]\n高度成熟的炼金术有时会重现传说。\n"
		L"-有%.1f%%的几率生成武具，而非灵药。\n"
		L"强化武具的性能。\n");



	//控件
	//////////////////////////////////////////////////////////////////////////

	//特性页面包含以下控件：
	//面板本体：切换类型和取消选择
	//信息页：显示已学习技能的效果文本（底下是ScrollView）
	//重置按钮：重置已学习技能
	//多个技能图标：选择当前技能
	//多个技能等级标签：显示每个技能的当前等级
	//+按钮：增加技能等级
	//-按钮：减少技能等级
	//光圈：高亮选中的技能图标，功能等价于+按钮

	//注意创建顺序决定了zorder
	//图标在最底下，光圈在图标上面，等级在图标和光圈上面，调整按钮在最上面，其他随意

	Ctrl特性面板->SetEventHandler(OnBackClick);

	//详情的文本量可能很多，一页放不下
	SetCreateControlParam(特性设置区宽度,类型按钮高度,Ctrl特性面板,PageId_Setting);
	详情滚动视图=EasyCreateScrollView(CID_特性技能详情滚动视图,特性信息区宽度,特性信息区高度,1200);
	SetCreateControlParam(0,0,详情滚动视图,PageId_Setting);
	特性技能详情页=EasyCreateLabel(CID_特性技能详情,特性信息区宽度-16,1200,NULL);	//经测试，即使点满1200也够了
	特性技能详情页->SetTextColor(0xFFC0A336);
	特性技能详情页->SetPadding(15);
	特性技能详情页->SetLineSpace(5);

	SetCreateControlParam(166,116,Ctrl特性面板,PageId_Setting);
	点数标签=EasyCreateLabel(PageId_Setting,150,20,L"1300/1300");
	点数标签->SetTextColor(0xFF4BA157);
		
	SetCreateControlParam(230,450,Ctrl特性面板,PageId_Setting);
	重置按钮=EasyCreateButton(CID_特性技能重置按钮,80,40,L"重置加点");
	重置按钮->SetEventHandler(OnResetLevelBtnClick);
		
	for (int i=0;i<特性技能总数;i++)
	{
		SetCreateControlParam(技能对象[i].X,技能对象[i].Y,Ctrl特性面板,PageId_Setting);
		CImage* CtrlImg=EasyCreateImage(CID_特性技能图标+i,技能图标宽度,技能图标高度);
		技能对象[i].技能控件=CtrlImg;
		CtrlImg->Visible=TRUE;
		CtrlImg->SetUserData((LPVOID)i);
		CtrlImg->SetEventHandler(OnSkillClick);
	}

	SetCreateControlParam(0,0,Ctrl特性面板,PageId_Setting);	//位置随便填
	技能光圈=EasyCreateImage(CID_特性技能图标光圈,技能图标宽度,技能图标高度);
	技能光圈->SetImage(EasyLoadImageR(RID_特性技能图标光圈Normal));
	//游戏里的Hover不一样，首先是换了高亮度的图标，不是简单的覆盖一层
	//其次0级时没有Hover特效，来回修改Hover图像太麻烦，所以放弃这个效果
	//技能光圈->SetHoverImage(EasyLoadImageR(RID_特性技能图标光圈Hover));
	技能光圈->Visible=FALSE;
	技能光圈->SetUserData((LPVOID)'+');
	技能光圈->SetEventHandler(OnLevelBtnClick);

	for (int i=0;i<特性技能总数;i++)
	{
		SetCreateControlParam(技能对象[i].X+等级标签偏移X,技能对象[i].Y+等级标签偏移Y,Ctrl特性面板,PageId_Setting);
		CImage* CtrlImg=EasyCreateImage(CID_特性技能等级+i,等级标签宽度,等级标签高度);
		技能对象[i].等级控件=CtrlImg;
		CtrlImg->Visible=FALSE;
	}

	SetCreateControlParam(100,100,Ctrl特性面板,PageId_Setting);	//位置随便填
	CImage* CtrlImg=EasyCreateImage(CID_特性技能升级按钮,升级按钮宽度,升级按钮高度);
	升级按钮=CtrlImg;
	CtrlImg->SetImage(EasyLoadImageR(RID_特性技能升级Normal));
	CtrlImg->SetHoverImage(EasyLoadImageR(RID_特性技能升级Hover));
	CtrlImg->SetPushImage(EasyLoadImageR(RID_特性技能升级Push));
	CtrlImg->Visible=FALSE;
	CtrlImg->SetUserData((LPVOID)'+');
	CtrlImg->SetEventHandler(OnLevelBtnClick);

	SetCreateControlParam(120,120,Ctrl特性面板,PageId_Setting);	//位置随便填
	CtrlImg=EasyCreateImage(CID_特性技能降级按钮,升级按钮宽度,升级按钮高度);
	降级按钮=CtrlImg;
	CtrlImg->SetImage(EasyLoadImageR(RID_特性技能降级Normal));
	CtrlImg->SetHoverImage(EasyLoadImageR(RID_特性技能降级Hover));
	CtrlImg->SetPushImage(EasyLoadImageR(RID_特性技能降级Push));
	CtrlImg->Visible=FALSE;
	CtrlImg->SetUserData((LPVOID)'-');
	CtrlImg->SetEventHandler(OnLevelBtnClick);
}


int OnBackClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UIEvent==EvtClick)
	{
		//设计失误，Click事件没带坐标
		//不过这种需要在内部判断的算是特例，大多数都在控件内封装好了
		int MouseX;
		int MouseY;
		UiMgr->GetMousePosForControl(CtrlObj,&MouseX,&MouseY);
		if (PointInRect(MouseX,MouseY,0,0,特性面板宽度,类型按钮高度))
		{
			int Index=MouseX/类型按钮宽度;
			if (Index!=当前类型)
				切换特性类型(Index);
		}
		else if (PointInRect(MouseX,MouseY,0,类型按钮高度,特性设置区宽度,特性设置区高度))
		{
			//点击左下设置区域的空白处会取消选择（右边被信息页覆盖点不到）
			if (当前技能!=-1)
				切换选中技能(-1);
		}
	}
	return 0;
}

int OnSkillClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UIEvent!=EvtClick)
		return 0;
	//点中图标不改变等级，而是让光圈覆盖在上面，再次点击会点到光圈，再增加等级
	int SkillId=(int)CtrlObj->UserData;
	if (SkillId!=当前技能)
		切换选中技能(SkillId);
	return 0;
}

int OnLevelBtnClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UIEvent!=EvtClick)
		return 0;
	//点击光圈等价于点击+，由于App不支持右键，不用处理光圈的-
	if ((int)CtrlObj->UserData=='+')
		变更技能等级(1);
	else if ((int)CtrlObj->UserData=='-')
		变更技能等级(-1);
	return 0;
}

int OnResetLevelBtnClick(UIControl* CtrlObj,UIEvent_t UIEvent,PVOID Param1,PVOID Param2)
{
	if (UIEvent==EvtClick)
		切换特性类型(当前类型);
	return 0;
}

void 切换特性类型(int TypeIndex)
{
	//切换索引并切换背景
	当前类型=TypeIndex;
	Ctrl特性面板->SetImage(EasyLoadImageR(RID_特性面板背景_规律+TypeIndex));

	//重置选择并隐藏光圈
	当前技能=-1;
	技能光圈->Visible=FALSE;

	//隐藏+-按钮
	升级按钮->Visible=FALSE;
	降级按钮->Visible=FALSE;

	//重置点数并更新点数标签
	总技能点数=1300;
	点数标签->SetText(L"1300/1300");
	点数标签->SetTextColor(0xFF4BA157);

	//重置所有等级并更新等级标签,同时更新图标
	//上一页的直接被隐藏了，每次只处理当前页面
	for (int i=0;i<特性技能总数;i++)
	{
		if (i>=技能类型索引[当前类型] && i<技能类型索引[当前类型]+技能类型数量[当前类型])
		{
			技能对象[i].等级=0;
			技能对象[i].等级控件->SetImage(EasyLoadImageR(RID_特性技能等级+0));
			//设计为所有图标都可用，0级显示暗图标
			技能对象[i].技能控件->SetImage(EasyLoadImageR(技能对象[i].暗图标Id));
			技能对象[i].技能控件->Visible=TRUE;
			技能对象[i].等级控件->Visible=TRUE;
		}
		else
		{
			//等级必须清零，否则会影响计算和显示详情
			技能对象[i].等级=0;
			技能对象[i].技能控件->Visible=FALSE;
			技能对象[i].等级控件->Visible=FALSE;
		}
	}

	//没有技能生效，详情内容置空，同时更新滚动条
	特性技能详情页->SetText(NULL);
	详情滚动视图->SetViewPosY(0);

	//更新至设置模块
	if (UI_AdjustState==0)
	{
		ChangeSettingByUI_Index(设置_特性类型,当前类型);
		//如果 技能类型数量[当前类型] 不足14个，会把用不到的位置也设为0
		for (int i=0;i<14;i++)
			ChangeSettingByUI_Index(设置_特性1等级+i,0);
	}
	SubmitSettingChange();
}

void 切换选中技能(int SkillIndex)
{
	当前技能=SkillIndex;
	if (SkillIndex!=-1)
	{
		//显示光圈和+-，并移动至目标的位置
		特性技能属性* 目标对象=&技能对象[当前技能];
		技能光圈->Visible=TRUE;
		技能光圈->X=目标对象->X;
		技能光圈->Y=目标对象->Y;
		升级按钮->Visible=TRUE;
		升级按钮->X=目标对象->X+升级按钮偏移X;
		升级按钮->Y=目标对象->Y+升级按钮偏移Y;
		降级按钮->Visible=TRUE;
		降级按钮->X=目标对象->X+降级按钮偏移X;
		降级按钮->Y=目标对象->Y+降级按钮偏移Y;
	}
	else
	{
		//隐藏光圈和+-
		技能光圈->Visible=FALSE;
		升级按钮->Visible=FALSE;
		降级按钮->Visible=FALSE;
	}
}

void 变更技能等级(int AddValue)
{
	if (当前技能==-1)
		return ;
	WCHAR Buf[1024];
	//更改等级并计算技能点(技能点是下一级的消耗,顺序不能错)
	特性技能属性* 目标对象=&技能对象[当前技能];
	if (AddValue==1)
	{
		if (目标对象->等级>=目标对象->等级上限)
			return ;
		总技能点数-=目标对象->点数消耗[目标对象->等级];
		目标对象->等级++;
	}
	else if (AddValue==-1)
	{
		if (目标对象->等级<=0)
			return ;
		目标对象->等级--;
		总技能点数+=目标对象->点数消耗[目标对象->等级];
	}

	//0级使用暗图标,其他等级使用亮图标
	if (目标对象->等级==0)
		目标对象->技能控件->SetImage(EasyLoadImageR(目标对象->暗图标Id));
	else
		目标对象->技能控件->SetImage(EasyLoadImageR(目标对象->图标Id));

	//满级修改等级标签样式
	if (目标对象->等级==目标对象->等级上限)
		目标对象->等级控件->SetImage(EasyLoadImageR(RID_特性技能等级满+目标对象->等级));
	else
		目标对象->等级控件->SetImage(EasyLoadImageR(RID_特性技能等级+目标对象->等级));

	//技能点更新，如果为负数，红色显示
	swprintf(Buf,L"%d/1300",总技能点数);
	点数标签->SetText(Buf);
	if (总技能点数<0)
		点数标签->SetTextColor(0xFFDA4000);
	else
		点数标签->SetTextColor(0xFF4BA157);

	//效果详情（其他类型的等级已置0）
	int Cur=0;
	Buf[0]=0;
	for (int i=0;i<特性技能总数;i++)
	{
		if (技能对象[i].等级!=0)
		{
			WCHAR* FmtText=技能对象[i].描述;
			int ParamNum=技能对象[i].提升参数数量;
			if (技能对象[i].动态描述生效等级!=-1 && 技能对象[i].等级>=技能对象[i].动态描述生效等级)
			{
				FmtText=技能对象[i].动态描述;
				ParamNum+=(int)技能对象[i].含有动态参数;
			}
			if (ParamNum==0)
			{
				//格式统一起来，如果用wcscpy，需要额外考虑百分号要不要转义
				int n=swprintf(Buf+Cur,FmtText);
				Cur+=n;
			}
			else if (ParamNum==1)
			{
				int n=swprintf(Buf+Cur,FmtText,技能对象[i].提升参数1[技能对象[i].等级-1]);
				Cur+=n;
			}
			else if (ParamNum==2)
			{
				int n=swprintf(Buf+Cur,FmtText,技能对象[i].提升参数1[技能对象[i].等级-1],技能对象[i].提升参数2[技能对象[i].等级-1]);
				Cur+=n;
			}
			else if (ParamNum==3)
			{
				int n=swprintf(Buf+Cur,FmtText,技能对象[i].提升参数1[技能对象[i].等级-1],
					技能对象[i].提升参数2[技能对象[i].等级-1],技能对象[i].提升参数3[技能对象[i].等级-1]);
				Cur+=n;
			}
			Buf[Cur]='\n';
			Cur++;
			Buf[Cur]=0;
		}
	}
	特性技能详情页->SetText(Buf);

	//仅需将此项等级更新到设置模块
	if (UI_AdjustState==0)
		ChangeSettingByUI_Index(设置_特性1等级+当前技能-技能类型索引[当前类型],目标对象->等级);
	SubmitSettingChange();
}

void 同步特性面板()
{
	WCHAR Buf[1024];
	//切换索引并切换背景
	当前类型=GetIndexSetting(设置_特性类型);
	Ctrl特性面板->SetImage(EasyLoadImageR(RID_特性面板背景_规律+当前类型));

	//重置选择并隐藏光圈
	当前技能=-1;
	技能光圈->Visible=FALSE;

	//隐藏+-按钮
	升级按钮->Visible=FALSE;
	降级按钮->Visible=FALSE;

	//从设置模块获取当前页面的技能，并设置图标
	//重置并隐藏其他页面的技能
	for (int i=0;i<特性技能总数;i++)
	{
		if (i>=技能类型索引[当前类型] && i<技能类型索引[当前类型]+技能类型数量[当前类型])
		{
			技能对象[i].等级=GetIndexSetting(设置_特性1等级+i-技能类型索引[当前类型]);
			if (技能对象[i].等级==0)
				技能对象[i].技能控件->SetImage(EasyLoadImageR(技能对象[i].暗图标Id));
			else
				技能对象[i].技能控件->SetImage(EasyLoadImageR(技能对象[i].图标Id));
			if (技能对象[i].等级==技能对象[i].等级上限)
				技能对象[i].等级控件->SetImage(EasyLoadImageR(RID_特性技能等级满+技能对象[i].等级));
			else
				技能对象[i].等级控件->SetImage(EasyLoadImageR(RID_特性技能等级+技能对象[i].等级));	
			技能对象[i].技能控件->Visible=TRUE;
			技能对象[i].等级控件->Visible=TRUE;
		}
		else
		{
			//等级必须清零，否则会影响计算和显示详情
			技能对象[i].等级=0;
			技能对象[i].技能控件->Visible=FALSE;
			技能对象[i].等级控件->Visible=FALSE;
		}
	}

	//累积扣除点数，更新至标签（如果为负数，红色显示）
	总技能点数=1300;
	for (int i=技能类型索引[当前类型];i<技能类型索引[当前类型]+技能类型数量[当前类型];i++)
	{
		for (int j=0;j<技能对象[i].等级;j++)
			总技能点数-=技能对象[i].点数消耗[j];
	}
	swprintf(Buf,L"%d/1300",总技能点数);
	点数标签->SetText(Buf);
	if (总技能点数<0)
		点数标签->SetTextColor(0xFFDA4000);
	else
		点数标签->SetTextColor(0xFF4BA157);

	//效果详情（其他类型的等级已置0）
	详情滚动视图->SetViewPosY(0);
	int Cur=0;
	Buf[0]=0;
	for (int i=0;i<特性技能总数;i++)
	{
		if (技能对象[i].等级!=0)
		{
			WCHAR* FmtText=技能对象[i].描述;
			int ParamNum=技能对象[i].提升参数数量;
			if (技能对象[i].动态描述生效等级!=-1 && 技能对象[i].等级>=技能对象[i].动态描述生效等级)
			{
				FmtText=技能对象[i].动态描述;
				ParamNum+=(int)技能对象[i].含有动态参数;
			}
			if (ParamNum==0)
			{
				//格式统一起来，如果用wcscpy，需要额外考虑百分号要不要转义
				int n=swprintf(Buf+Cur,FmtText);
				Cur+=n;
			}
			else if (ParamNum==1)
			{
				int n=swprintf(Buf+Cur,FmtText,技能对象[i].提升参数1[技能对象[i].等级-1]);
				Cur+=n;
			}
			else if (ParamNum==2)
			{
				int n=swprintf(Buf+Cur,FmtText,技能对象[i].提升参数1[技能对象[i].等级-1],技能对象[i].提升参数2[技能对象[i].等级-1]);
				Cur+=n;
			}
			else if (ParamNum==3)
			{
				int n=swprintf(Buf+Cur,FmtText,技能对象[i].提升参数1[技能对象[i].等级-1],
					技能对象[i].提升参数2[技能对象[i].等级-1],技能对象[i].提升参数3[技能对象[i].等级-1]);
				Cur+=n;
			}
			Buf[Cur]='\n';
			Cur++;
			Buf[Cur]=0;
		}
	}
	特性技能详情页->SetText(Buf);
	//更新UI期间无需通知计算模块
}

//大小700*500
void 详细构建_特性面板(int PageId,CImage* Ctrl特性面板)
{
	::Ctrl特性面板=Ctrl特性面板;
	初始化数据和创建控件();
}

void 重置设置_特性面板()
{
	同步特性面板();

	//测试时可直接指定类型并重置为0级
	//当前类型=特性_规律;
	//切换特性类型(特性_规律);
}

void 退出清理_特性面板()
{

}

